#include "myTask.h"
#include <stdio.h>
#include <string.h>
#include "cmdProcess.h"
#include "ringBuffer.h"
#include "segment_LED.h"
#include "redstone_line.h"

void task_heartbeat_func(void *param);
void task_cmd_func(void *param);
void task_adc_func(void *param);
void task_redstone_func(void *param);

volatile uint32_t realTicks; // 系统时间，溢出处理 todo
uint8_t flag_schedule = 0; // 调度开关标志位

// 任务控制块数组
taskCtrl taskList[] = {
    {
        .run = 1, // 立即执行
        .tickCounts = 100,
        .tickReload = 100,
        .flag = NULL,
        .pTaskFunc = task_heartbeat_func,
    },

    {
        .run = 0,
        .tickCounts = 200,
        .tickReload = 200,
        .flag = NULL,
        .pTaskFunc = task_cmd_func,
    },

    {
        .run = 0,
        .tickCounts = 5,
        .tickReload = 5,
        .flag = &flag_conversion_complete,
        .pTaskFunc = task_adc_func,
    },

    {
        .run = 0,
        .tickCounts = 50,
        .tickReload = 50,
        .flag = NULL,
        .pTaskFunc = task_redstone_func,
    },

    // end of list
    {
        .tickReload = 0,
    },
};


// 心拍任务
void task_heartbeat_func(void *param){

    static uint8_t i = 0;

    // LOG_FMT("Heartbeat: %d\n", i ++);
    // i = (i + 1) % 16;
    // SEG_LED_show_num(&mySegLED, SEG_LED_NUM_0 + i);

    i = (i + 1) % 10;
    SEG_LED_show_point(&mySegLED, !i);
}

// 处理命令任务
void task_cmd_func(void *param){
    static uint8_t cmd_buffer[CMDBUF_SIZE];

    // 读取命令
    if(SEGGER_RTT_HasData(0)){
        int len = SEGGER_RTT_Read(0, cmd_buffer, sizeof(cmd_buffer) - 1);
        if (len > 0) {
            cmd_buffer[len] = '\0'; // 添加字符串终止符

            process_command((char *)cmd_buffer); // 处理命令
        }
    }
}

uint16_t adc_redstone;
uint16_t adc_vref; // 内部参考电压
uint16_t adc_temp; // 内部温度传感器
uint16_t real_Vref = 1500; // 实际内部参考电压，毫伏
// ADC 读取任务
void task_adc_func(void *param){
    uint8_t *flag = ((taskCtrl *)param)->flag;

    // 处理 ADC 转换完成中断
    if(*flag){
        *flag = 0;

        adc_redstone = ADC_converted_data[0];
        adc_temp = ADC_converted_data[1]; // 内部温度传感器
        adc_vref = ADC_converted_data[2]; // 内部参考电压
        real_Vref = 4095*1200/adc_vref;
    }else {
        HAL_ADC_Start_IT(&hadc);
    }
}

// 处理红石输入
void task_redstone_func(void *param){

    myRS_line.show_strength(&myRS_line);
}


void task_schedule(void){
    uint8_t i;
    
    // 当倒计时结束或设定的任务标志位非 0，运行该任务
    for(i = 0; taskList[i].tickReload != 0; i++){
        if(taskList[i].flag != NULL && *(taskList[i].flag) != 0){
            taskList[i].run ++;
        }
        if(taskList[i].run != 0){
            taskList[i].run --;
            taskList[i].pTaskFunc(&taskList[i]);
        }
    }
}

void tick_tack(void){
    if(!flag_schedule){
        return ;
    }

    uint8_t i;
    realTicks ++;
    for(i = 0; taskList[i].tickReload != 0; i++){
        if(--taskList[i].tickCounts == 0){
            taskList[i].tickCounts = taskList[i].tickReload;
            taskList[i].run ++;
        }
    }
}

void start_schedule(void){
    flag_schedule = 1;
}

void stop_schedule(void){
    flag_schedule = 0;
}

void task_self_pending(taskCtrl *task){
    task->tickCounts = 0;
}
